package com.dk.aop;

import com.dk.util.DBUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;

/**
 * @author gcx
 * @date 2020/6/22
 * @Order Spring中的事务是通过aop来实现的，当我们自己写aop拦截的时候，
 *        会遇到跟spring的事务aop执行的先后顺序问题，比如说动态切换数据源的问题，
 *        如果事务在前，数据源切换在后，会导致数据源切换失效，所以就用到了Order（排序）这个关键字
 * @Aspect 里面可以定义切入点和通知
 * @Repository 加入容器
 */
@Order(1)
@Aspect
@Repository
public class DataSourceAspect {

    /**
     * 定义切入点，切入点为com.dk.service下的所有函数
     */
    @Pointcut("execution(public * com.dk.service..*.*(..))")
    public void dataSourceType(){}

    @AfterReturning(value="dataSourceType()")
    public void afterReturning(){
        DBUtil.remove();
    }

    @Before(value="dataSourceType()")
    public void before(JoinPoint joinPoint){
        //通过切点对象获取当前切点所在的方法名
        String signature = joinPoint.getSignature().getName();
        if (signature.startsWith("get"))
            DBUtil.setDB(DBUtil.SLAVE1);
        if (signature.startsWith("set"))
            DBUtil.setDB(DBUtil.MASTER);
        System.out.println("现在的库是————》"+DBUtil.getDb());
    }
}
